package utils;

public class MathServices {
	
	

	public static Double round(Double d, double digitsNumber){
		if(d!=null){
			double base = Math.pow(10, digitsNumber);
			int i = (int)base;
			return Math.floor(d * i) / i;
		}else{
			return null;
		}

	}

	public static String toString(Double[] array) {
		String s = "      [ ";
		s+="      [ ";
		for (int i = 0; i < array.length; i++) {
			s+=round(array[i],4);
		}
		s+="]\n";
		return s;
	}

	public static String toString(Integer[] array) {
		String s = "      [ ";
		if (array.length == 0) {
			s+="     ";
		} else {
			for (int i = 0; i < array.length; i++) {
				s+=array[i] + " ";
			}
		}
		s+="]\n";
		return s;
	}

	public static String toString(Double[][] matrix) {
		String s = "Dimensions:" + matrix.length + " x " + matrix[0].length +"\n";
		for (int i = 0; i < matrix.length; i++) {
			s+="      | ";
			for (int j = 0; j < matrix[0].length; j++) {
				s+=round(matrix[i][j],4);
			}
			s+="|\n";
		}
		return s;
	}

	public static String toString(Integer[][] matrix) {
		String s = "Dimensions:" + matrix.length + " x " + matrix[0].length +"\n";
		for (int i = 0; i < matrix.length; i++) {
			s+="      | ";
			for (int j = 0; j < matrix[0].length; j++) {
				s+=matrix[i][j] + " ";
			}
			s+="|\n";
		}
		return s;
	}

	public static String toString(Double[][] matrix, int numberOfDigits) {
		String s = "Dimensions:" + matrix.length + " x " + matrix[0].length + "\n";
		for (int i = 0; i < matrix.length; i++) {
			s+="      | ";
			for (int j = 0; j < matrix[0].length; j++) {
				s+=round(matrix[i][j],numberOfDigits) + "\t";
			}
			s+="|\n";
		}
		return s;
	}

//	public static void print(int n) {
//		System.out.println(n);
//	}
//
//	public static void print(Double d) {
//		System.out.println(d);
//	}
//
//	public static void print(Double[] array) {
//		System.out.print("      [ ");
//		for (int i = 0; i < array.length; i++) {
//			System.out.printf("%.4f\t", array[i]);
//		}
//		System.out.print("]\n");
//	}
//
//	public static void print(Integer[] array) {
//		System.out.print("      [ ");
//		if (array.length == 0) {
//			System.out.print("     ");
//		} else {
//			for (int i = 0; i < array.length; i++) {
//				System.out.print(array[i] + " ");
//			}
//		}
//		System.out.print("]\n");
//	}
//
//	public static void print(Double[][] matrix) {
//		System.out.println("Dimensions:" + matrix.length + " x " + matrix[0].length);
//		for (int i = 0; i < matrix.length; i++) {
//			System.out.print("      | ");
//			for (int j = 0; j < matrix[0].length; j++) {
//				System.out.printf("%.4f\t", matrix[i][j]);
//			}
//			System.out.print("|\n");
//		}
//	}
//
//	public static void print(Integer[][] matrix) {
//		System.out.println("Dimensions:" + matrix.length + " x " + matrix[0].length);
//		for (int i = 0; i < matrix.length; i++) {
//			System.out.print("      | ");
//			for (int j = 0; j < matrix[0].length; j++) {
//				System.out.print(matrix[i][j] + " ");
//			}
//			System.out.print("|\n");
//		}
//	}
//
//	public static void print(Double[][] matrix, String numberFormat) {
//		System.out.println("Dimensions:" + matrix.length + " x " + matrix[0].length);
//		for (int i = 0; i < matrix.length; i++) {
//			System.out.print("      | ");
//			for (int j = 0; j < matrix[0].length; j++) {
//				System.out.printf(numberFormat + "\t", matrix[i][j]);
//			}
//			System.out.print("|\n");
//		}
//	}

	public static Double sredniaArytmetyczna(Double[] zbiorLiczb) {
		double sum = 0;
		for (int i = 0; i < zbiorLiczb.length; i++) {
			sum += zbiorLiczb[i];
		}
		return sum / zbiorLiczb.length;
	}

	public static Double normalizacjaArytmetyczna(Double wartosc, Double[] zbiorLiczb) {
		Double sum = 0.0;
		for (int i = 0; i < zbiorLiczb.length; i++) {
			sum += zbiorLiczb[i];
		}
		return wartosc / sum;
	}

	public static Double[] normalizacjaArytmetyczna(Double[] wartosci, Double[] zbiorLiczb) {
		Double sum = 0.0;
		for (int i = 0; i < zbiorLiczb.length; i++) {
			sum += zbiorLiczb[i];
		}
		Double[] noweWartosci = new Double[wartosci.length];
		for (int i = 0; i < wartosci.length; i++) {
			noweWartosci[i] = wartosci[i] / sum;
		}
		return noweWartosci;
	}

	public static Double max(Double[] zbiorLiczb) {
		if (zbiorLiczb.length != 0) {
			double max = zbiorLiczb[0];
			for (int i = 0; i < zbiorLiczb.length; i++) {
				if (max < zbiorLiczb[i]) {
					max = zbiorLiczb[i];
				}
			}
			return max;
		} else {
			return null;
		}
	}

	public static double sum(double[] zbiorLiczb) {
		double sum = 0;
		for (int i = 0; i < zbiorLiczb.length; i++) {
			sum += zbiorLiczb[i];
		}
		return sum;
	}

	public static Double normalizacjaMax(Double wartosc, Double[] zbiorLiczb) {
		return wartosc / max(zbiorLiczb);
	}

	public static Double[] normalizacjaMax(Double[] zbiorWartosci, Double[] zbiorLiczb) {
		Double max = max(zbiorLiczb);
		for (int i = 0; i < zbiorWartosci.length; i++) {
			zbiorWartosci[i] = zbiorWartosci[i] / max;
		}
		return zbiorWartosci;
	}

	public static Double[] mnozeniePrzezWagi(Double[] zbiorWartosci, Double[] zbiorWag) {
		for (int i = 0; i < zbiorWartosci.length; i++) {
			zbiorWartosci[i] = zbiorWartosci[i] * zbiorWag[i];
		}
		return zbiorWartosci;
	}

	public static Double[] getRow(Double[][] array, int rowIndex) {
		Double row[] = new Double[array[rowIndex].length];
		for (int i = 0; i < array[rowIndex].length; i++) {
			row[i] = array[rowIndex][i];
		}
		return row;
	}

	public static Double[] getColumn(Double[][] array, int columnIndex) {
		Double column[] = new Double[array.length];
		for (int i = 0; i < array.length; i++) {
			column[i] = array[i][columnIndex];
		}
		return column;
	}

	public static Double[][] setRow(Double[][] array, Double[] row, int rowIndex) {
		for (int i = 0; i < array[rowIndex].length; i++) {
			array[rowIndex][i] = row[i];
		}
		return array;
	}

	public static Double[][] setColumn(Double[][] array, Double[] column, int columnIndex) {
		for (int i = 0; i < array.length; i++) {
			array[i][columnIndex] = column[i];
		}
		return array;
	}

	public static Double[][] arrayCopy(Double[][] source, Double[][] target) {
		for (int i = 0; i < source.length; i++) {
			System.arraycopy(source[i], 0, target[i], 0, source[i].length);
		}
		return target;
	}

}
